#include <stdio.h>
#include <stdlib.h>

typedef int DataType;
// 定义链栈节点结构体
typedef struct Node {
    DataType data;              // 数据元素
    struct Node* next;     // 指向下一个节点的指针
} StackNode, *LinkStack;

// 创建一个空的链栈
void InitStack(LinkStack *top) {
    top = NULL;                         // 头节点指针设置为NULL
}

// 进栈操作
void Push(LinkStack *top, DataType e)
{
    LinkStack p;
    p = (LinkStack)malloc(sizeof(StackNode));
    if (p == NULL)
    {
      printf("系统分配空间失败 ! \n");
      return;
    }
    p->data = e; // 存入新结点元素值
    p->next = *top; // 新结点与原粘顶相连接
    *top = p; // 新结点作为新栈顶
}

// 出栈操作
void Pop(LinkStack *top, DataType *e) 
{
    LinkStack p;
    if (!(*top)->next)
    {
      printf("栈为空 ! \n");
      return;
    }
    *e = (*top)->data; // 取出栈顶元素
    p = *top; // 保存原栈顶指针
    *top = (*top)->next; // 栈顶指针下移
    free(p); // 释放原栈顶结点
}

// 主函数
int main()
{
    LinkStack *S;
    DataType e;
    InitStack(S);
    Push(S, 1);
    Push(S, 2);
    Push(S, 3);
    Pop(S, &e);
    printf("pop: %d\n", e);
    Pop(S, &e);
    printf("pop: %d\n", e);
    Pop(S, &e);
    printf("pop: %d\n", e);
    // Pop(&S, &e);
    // printf("pop: %d\n", e);
    scanf("%d", &e);
    return 0;
}